/**
 * 阿福-移动web 函数库
 * 2016/8/26 建立
 */

// 定义全局变量
var ajaxPost="POST",ajaxCache=true;
var _token=$('[name="csrf-token"]').attr('content')||'';
var Global={
    message:{
        404:'服务器请求超时，请重试',
        500:''
    }
};

// DOM准备好时执行
$(function () {
    var notNeed = FastClick.notNeeded(document.body);
    $.fn.triggerFastClick=function(){
        this.trigger("click");
        if(!notNeed){
            this.trigger("click");
        }
    };

    //加token
    $(document).on('ajaxBeforeSend',function (e, jqXHR, options) {
        //全局请求添加token
        if(typeof options.token == 'undefined'&&_token&&!$('[name="csrf-token"]').hasClass('notAll')){
            options.data =options.data+'&_token='+_token;
        }
    });

    // 全局Ajax设置
    $.ajaxSettings.timeout=1e4;
    $.ajaxSettings.cache=ajaxCache;
    //处理tap穿透
    FastClick.attach(document.body);
    //到顶部
    !$('body').hasClass('no-goTop')&&goTop();
    //跳转
    $('[data-href]')[0]&&loadPage();
    //水平滚动分类
    $('.J-filter-scroll')[0]&&filterScroll();
    //轮播图
    $('.ui-slider')[0]&&sliderFun();
    //选项卡
    $('.J-tab')[0]&&initTab();
    //数字插件
    $('.ui-num-plugin')[0]&&$('.ui-num-plugin').not('.disabled').each(function () {numPlugin($(this));});
    //登录 & 注册
    $('body#login')[0]&&initLogin();
    $('body#register')[0]&&initRegister();
    //找回密码
    $('body#passwordLost')[0]&&passwordLost();
    //商品列表 滚动加载
    $('#scrollLoadGoods')[0]&&scrollLoadGoods();
    //输入框 清空按钮
    $('form')[0]&&$('form').find('input').filter(function () {return $(this).siblings('.ui-icon-close')[0];}).each(function () {ClearInputBind($(this));});
});

// 以下为页面私有方法


//判断浏览器
function isSafari() {
    var userAg=navigator.userAgent;
    return userAg.indexOf("Safari") > -1;
}
//跳转页面
function loadPage() {
    if(isSafari()){
        $('body').on('tap','[data-href]',function () {window.location.href=$(this).attr('data-href');});
    } else {
        $('body').on('click','[data-href]',function () {window.location.href=$(this).attr('data-href');});
    }
}
//水平滚动分类
function filterScroll() {
    var ul=$('.J-filter-scroll').find('ul'),lis=ul.find('li'),w=0;
    lis.each(function () { w+=$(this).width();});
    ul.css('width',w);
    var scroll = new fz.Scroll('.J-filter-scroll', { scrollY: false, scrollX: true});
    scroll.scrollToElement('li:nth-child('+(ul.find('.current').index()+1)+')',0);
}
//轮播图
function sliderFun(){
    var sliderItem=$('.ui-slider');

    if(sliderItem.attr('data-diy')){
        return false;
    }

    /* fz 即 FrozenJS 的意思 */
    var slider = new fz.Scroll('.ui-slider', {
        role: 'slider',
        indicator: true,
        autoplay: true,
        interval: 3000
    });
}
//到顶部
function goTop() {
    var tpl=$('<a id="toTop" class="af-to-top"><span><i class="ui-icon-gototop"></i></span></a>');
    var body = $('body');
    $(window).on('scroll',function () {
        var scrollTop=body.scrollTop();
        var winH=$(window).height();
        var toTop=$('#toTop');
        if(scrollTop<winH*0.6&&toTop[0]){
            toTop.remove();
        }else if(scrollTop>=winH*0.6&&!toTop[0]){
            body.append(tpl);
        }
    });
    if(isSafari()){
        body.on('tap','#toTop',function () {
            body.scrollTop(0);
        });
    }else{
        body.on('click','#toTop',function () {
            body.scrollTop(0);
        });
    }

}
//商品列表 滚动加载
function scrollLoadGoods() {
    // var tpl=wrap.find('template').html();
    var tpl='<li class="${class}">'
        +'<div class="ui-goods-card">'
        +'<div data-href="/goods/show/${goods_id}" class="ui-grid-halve-img af-border-b">'
        +'<span style="background-image:url(${mobile_goods_thumb})"></span>'
        +'</div>'
        +'<div class="ui-goods-info">'
        +'<h3 data-href="/goods/show/${goods_id}" class="ui-nowrap">${goods_name}</h3>'
        +'<p><span class="shop-price">¥${shop_price}</span><del class="market-price">¥${market_price}</del></p>'
        +'</div>'
        +'</div>'
        +'</li>';

    var wrap=$('#scrollLoadGoods');
    var url=wrap.attr('data-url');
    var body = $('body');
    var isOver=false;
    DelCookie('scroll_loading');

    tpl=wrap.find('#goodsTpl')[0]?wrap.find('#goodsTpl').html():tpl;

    $(window).on('scroll',function () {
        if(isOver) return false;
        var scrollTop=body.scrollTop();
        var winH=$(window).height();
        var docH=body.height();
        if(scrollTop+winH>docH-150&&!GetCookie('scroll_loading')&&!isOver){
            var page=wrap.data('page')||2;
            SetCookie('scroll_loading',1);
            $.ajax({url:url,type:'post',dataType:'json',data:{page:page},
                success:function (data) {
                    var goods=data.goods.data;
                    var liArr=[];
                    if(data.status&&goods.length>0){
                        for(var i=0;i<goods.length;i++){
                            liArr.push(HtmlTemplate(tpl,$.extend({'class':i%2==0?'l':'r'},goods[i])));
                        }
                        wrap.data('page',page*1+1);
                        wrap.append(liArr.join(''));
                    }else{
                        var loading=wrap.next('.ui-loading-wrap');
                        loading[0]&&loading.find('i').hide();
                        loading[0]&&loading.find('p').text('别拉了，到底啦~');
                        isOver=true;
                    }
                },
                error:function (error) {
                    topTip(error.messgae||'服务器忙',{type:'warn'});
                },
                complete:function () {
                    setTimeout(function () {
                        DelCookie('scroll_loading');
                        // !isOver&&$(window).scroll();
                    },1000);
                }
            });
        }
    });
    $(window).scroll();
}
//操作提示
function topTip(msg,opts) {
    opts=typeof opts==='undefined'?{}:opts;
    opts=$.extend({stayTime:2000,type:"success"},opts);
    var tip=$.tips({content:msg,stayTime:opts.stayTime,type:opts.type});
    tip.on("tips:hide",function(){typeof opts.cb==='function'&&opts.cb();});
}
//tab
function initTab() {
    var tab = new fz.Scroll('.J-tab', { role: 'tab'});

    tab.scrollToElement("li.current", 1000, true, true);
    /* 滑动开始前 */
    tab.on('beforeScrollStart', function(from, to) {
        // from 为当前页，to 为下一页
    });

    /* 滑动结束 */
    tab.on('scrollEnd', function(curPage) {
        // curPage 当前页
    });
}
//数字插件
function numPlugin(obj) {
    var minBtn=obj.find('.ui-num-min'),
        addBtn=obj.find('.ui-num-add'),
        input=obj.find('.ui-num-input'),
        min=input.attr('min')||1,
        max=input.attr('max')||999,
        val=input.val()*1;

    val<=min&&minBtn.addClass('disabled');
    val>=max&&addBtn.addClass('disabled');

    addBtn.on('tap',function () {
        val=input.val()*1;
        changeInput(val+1);
    });
    minBtn.on('tap',function () {
        val=input.val()*1;
        changeInput(val-1);
    });

    function changeInput(val) {
        var result=val;

        min=input.attr('min')||1;
        max=input.attr('max')||999;
        addBtn.toggleClass('disabled',val>=max);
        minBtn.toggleClass('disabled',val<=min);
        if(val>=max){
            result=max;
        }
        if(val<=min){
            result=min;
        }

        input.val(result).trigger('change');
    }
}
//登录
function initLogin() {
    var form=$('#form');
    $("form").submit(function(){
        var isOk = RegForm(form);
        if(!isOk) return isOk;

        Submit(form,function (data) {
            window.location.href=data.returnUrl||'/';
        });
        return false;
    });
    //删除按钮
    // form.find('input').filter(function () {return $(this).siblings('.ui-icon-close')[0];}).each(function () {ClearInputBind($(this));});
    //显示密码
    var switchItem=form.find('.ui-switch');
    switchItem[0]&&TogglePwd(switchItem);
}
//注册
function initRegister() {
    var form=$('#form');
    var switchItem=form.find('.ui-switch');
    var cDItem=form.find('.J-countDown');
    var picCodeInput=form.find('#picCode');
    var phoneInput=form.find('#phone');

    $("form").submit(function(){
        var isOk = RegForm(form);
        if(!isOk) return isOk;

        Submit(form,function (data) {
            window.location.href='/user/login';
        });
        return false;
    });
    //删除按钮
    // form.find('input').filter(function () {
    //     return $(this).siblings('.ui-icon-close')[0];
    // }).each(function () {ClearInputBind($(this));});
    //显示密码
    switchItem[0]&&TogglePwd(switchItem);
    //倒计时
    cDItem.on('click',function () {
        //检查手机和验证码输入框的值是否有效
        if(RegInput(picCodeInput)||RegInput(phoneInput)) return false;
        //按钮禁用时终止时间
        if(cDItem.hasClass('disabled')) return false;
        Countdown(cDItem,'/user/sms',{'phone':phoneInput.val(),'chkCode':picCodeInput.val()});
    });
}
//找回密码
function passwordLost() {
    var form=$('#form');
    var phoneInput=form.find('#phone');

    $("form").submit(function(){
        var isOk = RegForm(form);
        if(!isOk) return isOk;

        Submit(form,function (data) {
            window.location.href=data.returnUrl;
        });
        return false;
    });
    //删除按钮
    // form.find('input').filter(function () {
    //     return $(this).siblings('.ui-icon-close')[0];
    // }).each(function () {ClearInputBind($(this));});
    //显示密码
    var switchItem=form.find('.ui-switch');
    switchItem[0]&&TogglePwd(switchItem);

    //倒计时
    var cDItem=form.find('.J-countDown');
    cDItem.on('click',function () {
        //按钮禁用时终止时间
        if(cDItem.hasClass('disabled')) return false;
        Countdown(cDItem,'/user/sendSms',{'phone':phoneInput.val()});
    });
}
//刷新验证码
function reCaptcha(dom) {
    var $url = "/captcha" + "/" + Math.random();
    dom.attr('src',$url);
}
// 以上为页面私有方法

//++++++++++++++++++++++++++++++++++++++++++++++++++++++

// 以下为公共方法

//函数：弹框提示(提示信息，自动消失时间)
function Alert(msg,time) {
    var dialog=$.dialog({
        title:'提示信息',
        content:msg,
        button:['确认']
    });
    typeof time !== 'undefined'&&setTimeout(function () {dialog.dialog("hide")},time);
}
//函数：锁屏幕（锁屏提示信息）
function Locked(txt){
    var el=$.loading({content:txt||'加载中...'});
    el.startTime=Date.now();
    return el;
}
//函数：解锁屏幕（锁屏对象）
function UnLocked(el){
    var time=Date.now()-el.startTime>=500?0:500;
    var timer=setTimeout(function () {
        el.loading("hide");
        clearTimeout(timer);
    },time);
}
//函数：通用表单提交（DOM，匿名函数）
function Submit(form,f){
    f==undefined&&(f=function(form){});
    var mark=Locked();
    if (RegForm(form)){
        $.ajax({
            url:form.attr("action"),
            data:form.serialize(),
            type:ajaxPost,
            success:function(data){
                UnLocked(mark);
                if (data.status){
                    f(data);
                    typeof data.message=='string'&&topTip(data.message);
                }else{
                    topTip(data.message||'请求超时',{type:'warn'});
                }
            },
            error:function(){
                UnLocked(mark);
                topTip("服务器繁忙，请刷新重试！",{type:'warn'});
            }
        });
    }else{
        UnLocked(mark);
        topTip("请检查输入");
    }
}
//函数：检查表单符合正则(DOM)
function RegForm(form) {
    var v=!0,i=0;
    // var btn=form.find('[type="submit"]');
    var error=[];
    var firstErrorMsg='';

    form.find("input,select,textarea").each(function(){
        var that=$(this),reg=that.attr("data-reg");
        var unReg=(reg!==null&&reg!=="")&&(new RegExp(reg)).exec(that.val())==null;
        var unRequired=that.prop('required')&&$.trim(that.val())==='';
        if(unReg||unRequired){
            if(firstErrorMsg==''){
                if(unRequired){
                    firstErrorMsg=that.attr('placeholder');
                }else{
                    firstErrorMsg=that.attr('data-reg-msg');
                }
            }


            v=!1;i++;
            that.closest('.ui-form-item').css({"backgroundColor":"rgba(255, 0, 0, 0.2)"});
            that.one("focusin",function(){that.closest('.ui-form-item').css({"backgroundColor":"#fff"})});
            error.push(that.attr('data-reg-msg')||that.attr('placeholder'));
        }
    });
    v||topTip(firstErrorMsg||'请检查输入',{type:"warn"});

    return v;
}
//函数：检查输入框符合正则(DOM)
function RegInput(input) {
    var that=input,reg=that.attr("data-reg");
    var unReg=(reg!==null&&reg!=="")&&(new RegExp(reg)).exec(that.val())==null;
    var unRequired=that.prop('required')&&$.trim(that.val())==='';
    if(unReg||unRequired){
        that.closest('.ui-form-item').css({"backgroundColor":"#f5f5dc"});
        that.one("focusin",function(){that.closest('.ui-form-item').css({"backgroundColor":"#fff"})});
        topTip(that.attr('placeholder')||'请检查输入',{type:'warn'});
    }

    return unReg||unRequired;
}
//函数：输入框清空按钮(DOM)
function ClearInputBind(input) {
    input.on('focus',function () {
        $(this).siblings('.ui-icon-close').show();
    });
    input.on('blur',function () {
        $.trim($(this).val())==''&&$(this).siblings('.ui-icon-close').hide();
    });
    input.siblings('.ui-icon-close').on('click',function () {
        input.val('').focus();
    });
}
//函数：显示/隐藏密码(Dom)
function TogglePwd(switchItem) {
    switchItem.each(function () {
        var that=$(this);
        var pwdInput=that.siblings('input');
        var swInput=that.find('input');
        swInput.on('change',function () {
            pwdInput.attr('type',swInput.prop('checked')?'text':'password');
        });
    });
}
//函数：验证码倒数读秒（DOM）
function Countdown(dom,url,data){
    var txtItem=dom.find("i");
    var t=dom.attr('data-time');
    var timespan=Date.now();
    var oldTime=GetCookie("afu_locked");
    if(oldTime&&timespan-oldTime<60*1000){
        topTip('发送过于频繁，请'+(60-Math.ceil((oldTime&&timespan-oldTime)/1000))+'秒后再试',{type:'warn'});
        return;
    }
    MyAjax(url,'post',data,function (res) {
        SetCookie("afu_locked",Date.now());
        txtItem.text(t);
        dom.addClass('disabled');
        dom.find("span").toggle();
        var i=t,s=setInterval(function(){
            i--;txtItem.text(i);
            i<=0&&(DelCookie("afu_locked"),dom.removeClass('disabled'),dom.find("span").toggle(),clearInterval(s));
        },1e3);
    });
}

//函数：设置Cookie（名字，值）
function SetCookie(n,value){
    var Days=30;
    var exp=new Date();
    exp.setTime(exp.getTime()+Days*86400*1000);
    document.cookie=n+"="+escape(value)+";expires="+exp.toGMTString();
}
//函数：获取Cookie（名字）
function GetCookie(n){
    var arr=document.cookie.match(new RegExp("(^| )"+n+"=([^;]*)(;|$)"));
    if(arr!=null) return unescape(arr[2]);
    return null;
}
//函数：删除Cookie（名字）
function DelCookie(n){
    var exp=new Date();
    exp.setTime(exp.getTime()-1);
    var cval=GetCookie(n);
    if(cval!=null) document.cookie=n+"="+cval+";expires="+exp.toGMTString();
}
//函数：获取URL参数（变量）
function GetVar(s){
    var r=new RegExp("(^|)"+s+"=([^\&]*)(\&|$)","gi").exec(String(location.href)),t;
    if (t=r) return t[2];
    return "";
}
//函数：页面跳转（地址）
function Jump(url){
    location.href=url;
}
//函数：HTML模版替换(html模版，数据，是否可为空，匹配字符)   默认匹配字符:"${xxx}";
function HtmlTemplate(template, data, allowEmpty, chats) {
    var regExp;
    chats = chats || ['\\$\\{', '\\}'];
    regExp = [chats[0], '([_\\w]+[\\w\\d_]?)', chats[1]].join('');
    regExp = new RegExp(regExp, 'g');
    //${xxx}
    return template.replace(regExp,
    //该函数的第一个参数是匹配模式的字符串(例子：${name})。接下来的参数是与模式中的子表达式匹配的字符串(例子：name)，可以有 0 个或多个这样的参数。接下来的参数是一个整数，声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
    function (s, s1) {
        if (data[s1] != null && data[s1] != undefined) {
            return data[s1];
        } else {
            return allowEmpty ? '' : s;
        }
    });
}
//通用ajax提交
function MyAjax(url,type,data,callback) {
    var lk=Locked();
    $.ajax({
        url:url,type:type,dataType:'json',data:data,
        success:function (res) {
            if(res.status){
                typeof callback=='function'&&callback(res);
            }else if(res.message=='请登录'){
                window.location.href='/user/login?return_url='+window.location.href;
            }else{
                topTip(res.message||'提交失败',{type:'warn'});
            }
        },
        error:function (e) {
            topTip(e.responseText||e.message||'提交失败',{type:'warn'});
        },
        complete:function () {
            UnLocked(lk);
        }
    });
}
//数组去重
function UniqueArray(arr) {
    var result = [], isRepeated;
    for (var i = 0; i < arr.length; i++) {
        isRepeated = false;
        for (var j = 0; j < result.length; j++) {
            if (arr[i] == result[j]) {
                isRepeated = true;
                break;
            }
        }
        if (!isRepeated) {
            result.push(arr[i]);
        }
    }
    return result;
}